﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CAGFIP.Edicao;
using CAGFIP.Jogo;

namespace CAGFIP.GUI
{
    public class Configuracao : Panel
    {
        private List<CheckBox> assuntos;

        public Configuracao()
        {
            this.assuntos = new List<CheckBox>();
            this.Dock = DockStyle.Fill;
            this.Location = new System.Drawing.Point(0, 0);
            initComponents();
        }

        private void initComponents()
        {
            iniciarJogo = new Button();
            iniciarJogo.Text = "Iniciar jogo";
            iniciarJogo.Location = new System.Drawing.Point(87, 531);
            iniciarJogo.Size = new System.Drawing.Size(100, 25);
            iniciarJogo.TabIndex = 3;
            iniciarJogo.UseVisualStyleBackColor = true;
            iniciarJogo.Enabled = false;
            iniciarJogo.Click += new EventHandler(iniciarJogo_Click);

            voltar = new Button();
            voltar.Text = "Voltar";
            voltar.Location = new System.Drawing.Point(208, 531);
            voltar.Size = new System.Drawing.Size(100, 25);
            voltar.TabIndex = 4;
            voltar.UseVisualStyleBackColor = true;
            voltar.Click += new EventHandler(voltar_Click);

            descricaoDificuldade = new TextBox();
            descricaoDificuldade.Location = new System.Drawing.Point(87, 299);
            descricaoDificuldade.Multiline = true;
            descricaoDificuldade.Size = new System.Drawing.Size(221, 206);
            descricaoDificuldade.TabIndex = 2;
            descricaoDificuldade.ReadOnly = true;
            descricaoDificuldade.BackColor = System.Drawing.Color.White;

            descricaoJogo = new TextBox();
            descricaoJogo.Location = new System.Drawing.Point(87, 27);
            descricaoJogo.Multiline = true;
            descricaoJogo.Size = new System.Drawing.Size(625, 170);
            descricaoJogo.TabIndex = 0;
            descricaoJogo.ReadOnly = true;
            descricaoJogo.BackColor = System.Drawing.Color.White;
            descricaoJogo.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in lacus libero. Curabitur vel lacus ut neque placerat bibendum et sit amet ligula. Nam mauris justo, posuere non adipiscing ut, sollicitudin a mauris. Sed elementum feugiat vehicula. Vestibulum lacinia gravida massa et sodales. Nam malesuada laoreet arcu, id ornare sapien eleifend vitae. Mauris tincidunt pulvinar euismod. Ut elit elit, semper nec cursus id, varius vel urna. Sed in bibendum libero. Aliquam erat volutpat. Nunc posuere sapien in purus eleifend vestibulum. Fusce diam libero, lobortis id vehicula ullamcorper, hendrerit aliquam eros. Nullam id leo orci, vitae dictum magna. Etiam sed lectus risus, eget ornare enim. Sed non leo in arcu semper fermentum at a urna. Aliquam imperdiet aliquet diam at placerat. Quisque vitae urna in nisi rhoncus lobortis eu id lectus. ";

            toolTip = new ToolTip();

            dificuldadeLabel = new Label();
            dificuldadeLabel.Location = new System.Drawing.Point(87, 237);
            dificuldadeLabel.Size = new System.Drawing.Size(135, 20);
            dificuldadeLabel.Text = "Dificuldade:";

            assuntoLabel = new Label();
            assuntoLabel.Location = new System.Drawing.Point(394, 237);
            assuntoLabel.Size = new System.Drawing.Size(60, 20);
            assuntoLabel.Text = "Assuntos:";

            dificuldadeCBox = new ComboBox();
            dificuldadeCBox.Location = new System.Drawing.Point(87, 257);
            dificuldadeCBox.Size = new System.Drawing.Size(221, 21);
            dificuldadeCBox.FormattingEnabled = false;
            dificuldadeCBox.TabIndex = 1;
            dificuldadeCBox.DropDownStyle = ComboBoxStyle.DropDownList;
            foreach (var el in System.Enum.GetValues(typeof(DificuldadeCode)))
            {
                dificuldadeCBox.Items.Add(el);
            }
            dificuldadeCBox.SelectedIndexChanged += new EventHandler(dificuldadeCBox_SelectedIndexChanged);

            selecionarNenhum = new Button();
            selecionarNenhum.Location = new System.Drawing.Point(480, 235);
            selecionarNenhum.Size = new System.Drawing.Size(130, 20);
            selecionarNenhum.Text = "Selecionar Nenhum";
            selecionarNenhum.Click += new EventHandler(selecionarNenhum_Click);

            selecionarTodos = new Button();
            selecionarTodos.Location = new System.Drawing.Point(620, 235);
            selecionarTodos.Size = new System.Drawing.Size(130, 20);
            selecionarTodos.Text = "Selecionar Todos";
            selecionarTodos.Click += new EventHandler(selecionarTodos_Click);

            this.Controls.Add(iniciarJogo);
            this.Controls.Add(voltar);
            this.Controls.Add(descricaoDificuldade);
            this.Controls.Add(descricaoJogo);
            this.Controls.Add(dificuldadeLabel);
            this.Controls.Add(assuntoLabel);
            this.Controls.Add(selecionarTodos);
            this.Controls.Add(selecionarNenhum);
            this.Controls.Add(dificuldadeCBox);

            dificuldadeCBox.SelectedIndex = 0;
            ExibirDescricaoDificuldade();
        }

        void dificuldadeCBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            ExibirDescricaoDificuldade();
        }

        private void ExibirDescricaoDificuldade()
        {
            var dc = DificuldadeCollection.Instance[(CAGFIP.Jogo.DificuldadeCode)dificuldadeCBox.SelectedItem];

            descricaoDificuldade.Text = dc.Descricao;
        }

        void voltar_Click(object sender, EventArgs e)
        {
            DoCleanup();
            ControladorGUI.Instance.ExibirMenuInicial();
        }

        void iniciarJogo_Click(object sender, EventArgs e)
        {
            List<int> listaAssuntos = new List<int>();

            foreach (CheckBox assuntoChBox in assuntos)
                if (assuntoChBox.Checked)
                    listaAssuntos.Add(((Assunto)assuntoChBox.Tag).Id);
            DoCleanup();

            ControladorGUI.Instance.CarregarConfiguracoes(listaAssuntos, (CAGFIP.Jogo.DificuldadeCode)dificuldadeCBox.SelectedItem);
        }

        public void ConfigurarAssuntos(List<Assunto> assuntosDisponiveis)
        {
            int posicaoX = 394;
            int posicaoY = 257;
            foreach (Assunto assunto in assuntosDisponiveis)
            {
                CheckBox novoAssunto = new CheckBox();
                novoAssunto.Location = new System.Drawing.Point(posicaoX, posicaoY);
                novoAssunto.Text = assunto.Nome;
                novoAssunto.Tag = assunto; 
                novoAssunto.Size = new System.Drawing.Size(novoAssunto.Size.Width, 17);
                novoAssunto.CheckStateChanged += new EventHandler(novoAssunto_CheckStateChanged);
                novoAssunto.MouseEnter += new EventHandler(novoAssunto_MouseEnter);
                novoAssunto.MouseLeave += new EventHandler(novoAssunto_MouseLeave);

                this.Controls.Add(novoAssunto);
                assuntos.Add(novoAssunto);
                posicaoY += 17;
            }
        }
        void novoAssunto_MouseEnter(object sender, EventArgs e)
        {
            CheckBox cbox = (CheckBox)sender;

            string descricao = ((Assunto)cbox.Tag).Descricao;
            int x = cbox.Location.X + 28;
            int y = cbox.Location.Y - 17;
            this.toolTip.Show(descricao, this, x, y);
        }

        void novoAssunto_MouseLeave(object sender, EventArgs e)
        {
            this.toolTip.Hide(this);
        }

        void novoAssunto_CheckStateChanged(object sender, EventArgs e)
        {
            foreach (var cbox in assuntos)
                if (cbox.Checked)
                {
                    iniciarJogo.Enabled = true;
                    return;
                }
            iniciarJogo.Enabled = false;
        }

        void selecionarTodos_Click(object sender, EventArgs e)
        {
            foreach (var cbox in assuntos)
                cbox.Checked = true;
        }

        void selecionarNenhum_Click(object sender, EventArgs e)
        {
            foreach (var cbox in assuntos)
                cbox.Checked = false;
        }

        internal void DoCleanup()
        {
            foreach (var cbox in assuntos)
                this.Controls.Remove(cbox);
            assuntos.Clear();

            this.iniciarJogo.Enabled = false;
        }

        private Label dificuldadeLabel;
        private Label assuntoLabel;
        private Button selecionarTodos;
        private Button selecionarNenhum;
        private Button iniciarJogo;
        private Button voltar;
        private TextBox descricaoDificuldade;
        private TextBox descricaoJogo;
        private ComboBox dificuldadeCBox;
        private ToolTip toolTip;
    }

}
